#include "spi.h"

/********** MT6816 **********/
/********** MT6816 **********/
/********** MT6816 **********/
/**
    * @brief  SPI初始化(MT6816)
    * @param  NULL
    * @retval NULL
**/
void REIN_SPI_MT6816_SPI_Init(void)
{
    /*GPIO Ports Clock Enable*/
    rcu_periph_clock_enable(RCU_GPIOB);
    /* GPIO Ports Clock Enable */
    rcu_periph_clock_enable(RCU_GPIOA); // 启用MT6816_SPI_CS端口时钟
    MT6816_SPI_SPI_CLK_ENABLE();          //启用SPI时钟
    rcu_periph_clock_enable(RCU_AF);
    gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP,ENABLE);

    /*Configure GPIO pins*/
    gpio_init(MT6816_SPI_CS_GPIO_Port,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,MT6816_SPI_CS_Pin);
    /*Configure GPIO pins*/
    gpio_init(MT6816_SPI_CLK_GPIO_Port,GPIO_MODE_AF_PP,GPIO_OSPEED_MAX,MT6816_SPI_CLK_Pin);
    /*Configure GPIO pins*/
    gpio_init(MT6816_SPI_MOSI_GPIO_Port,GPIO_MODE_AF_PP,GPIO_OSPEED_MAX,MT6816_SPI_MOSI_Pin);
    /*Configure GPIO pins*/
    gpio_init(MT6816_SPI_MISO_GPIO_Port,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_MAX,MT6816_SPI_MISO_Pin);

    /*Configure AFIO*/
#ifdef MT6816_SPI_AFIO_REMAP
    MT6816_SPI_AFIO_REMAP                //启用备用的SPI_AFIO映射
#endif

    /* SPI初始化 */

    spi_parameter_struct spi_init_struct;
    spi_struct_para_init(&spi_init_struct);

    spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;  // 全双工
    spi_init_struct.device_mode          = SPI_MASTER;                // 主机模式
    spi_init_struct.frame_size           = SPI_FRAMESIZE_16BIT;       // 16位数据
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;   // CPOL=1, CPHA=1
    spi_init_struct.nss                  = SPI_NSS_SOFT;              // 软件NSS
    spi_init_struct.prescale             = SPI_PSC_4;                 // 分频系数 spi2在APB1 APB1经过2分频后频率为24MHZ
    spi_init_struct.endian               = SPI_ENDIAN_MSB;            // MSB优先

    spi_init(MT6816_SPI_Get_HSPI, &spi_init_struct);

    /* 禁用CRC */
    spi_crc_polynomial_set(MT6816_SPI_Get_HSPI, 10);       // CRC校验多项式
    spi_crc_off(MT6816_SPI_Get_HSPI);                      // 禁用CRC校验

    /*Configure GPIO pin Output Level*/
    gpio_bit_reset(MT6816_SPI_CS_GPIO_Port, MT6816_SPI_CS_Pin); // CS引脚启动输出高电平

    /* 使能SPI */
    spi_enable(MT6816_SPI_Get_HSPI);

}

/********** OLED **********/
/********** OLED **********/
/********** OLED **********/
/**
    * @brief  SPI初始化(OLED)
    * @param  NULL
    * @retval NULL
**/
void REIN_SPI_OLED_SPI_Init(void)
{
    /* AFIO初始化 */
    /*GPIO Ports Clock Enable*/
    OLED_SPI_SCK_GPIO_CLK_ENABLE();                                //启用SCK端口时钟
    OLED_SPI_MOSI_GPIO_CLK_ENABLE();                            //启用MOSI端口时钟
    /*Configure GPIO pins*/
    gpio_init(OLED_SPI_SCK_GPIO_Port,GPIO_MODE_AF_PP,GPIO_OSPEED_MAX,OLED_SPI_SCK_Pin);
    /*Configure GPIO pins*/
    gpio_init(OLED_SPI_MOSI_GPIO_Port,GPIO_MODE_AF_PP,GPIO_OSPEED_MAX,OLED_SPI_MOSI_Pin);
    /*Configure AFIO*/
#ifdef OLED_SPI_AFIO_REMAP
    OLED_SPI_AFIO_REMAP                //启用备用的SPI_AFIO映射
#endif

    /* SPI初始化 */
    OLED_SPI_CLK_ENABLE();                        //启用SPI时钟  

    spi_parameter_struct spi_init_struct;
    spi_struct_para_init(&spi_init_struct);

    spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;  // 全双工
    spi_init_struct.device_mode          = SPI_MASTER;                // 主机模式
    spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;       // 8位数据
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;   // CPOL=1, CPHA=1
    spi_init_struct.nss                  = SPI_NSS_SOFT;              // 软件NSS
    spi_init_struct.prescale             = OLED_SPI_Prescaler;      // 分频系数
    spi_init_struct.endian               = SPI_ENDIAN_MSB;            // MSB优先

    spi_init(OLED_SPI_Get_HSPI, &spi_init_struct);

    /* 禁用CRC */
    spi_crc_polynomial_set(OLED_SPI_Get_HSPI, 10);       // CRC校验多项式
    spi_crc_off(OLED_SPI_Get_HSPI);                      // 禁用CRC校验

    /* 使能SPI */
    spi_enable(OLED_SPI_Get_HSPI);
}
